home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / nos042_s / fingerd.c < prev    next >
C/C++ Source or Header  |  1994-09-16  |  3KB  |  114 lines

  1. /*
  2.     Internet Finger server
  3.    Copyright 1991 Phil Karn, KA9Q
  4. */
  5.  
  6. /****************************************************************************
  7. *    $Id: fingerd.c 1.2 94/02/02 14:37:43 ROOT_DOS Exp $
  8. *
  9. *    01 Feb 93    1.2    GT    New sendfile () prototype.                        
  10. ****************************************************************************/
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include "global.h"
  15. #include "files.h"
  16. #include "mbuf.h"
  17. #include "socket.h"
  18. #include "session.h"
  19. #include "proc.h"
  20. #include "dirutil.h"
  21. #include "commands.h"
  22. #include "mailbox.h"
  23.  
  24. static int Sfinger = -1;    /* Prototype socket for service */
  25.  
  26. static void __stdargs fingerd __ARGS((int s,void *unused,void *p));
  27.  
  28. /* Start up finger service */
  29. int
  30. finstart(argc,argv,p)
  31. int argc;
  32. char *argv[];
  33. void *p;
  34. {
  35.     struct sockaddr_in lsocket;
  36.     int s;
  37.  
  38.     if(Sfinger != -1){
  39.         return 0;
  40.     }
  41.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  42.     chname(Curproc,"Finger listener");
  43.  
  44.     lsocket.sin_family = AF_INET;
  45.     lsocket.sin_addr.s_addr = INADDR_ANY;
  46.     if(argc < 2)
  47.         lsocket.sin_port = IPPORT_FINGER;
  48.     else
  49.         lsocket.sin_port = atoi(argv[1]);
  50.  
  51.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  52.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  53.     listen(Sfinger,1);
  54.     for(;;){
  55.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  56.             break;    /* Service is shutting down */
  57.  
  58.         /* Spawn a server */
  59.         newproc("fingerd",512,fingerd,s,NULL,NULL,0);
  60.     }
  61.     return 0;
  62. }
  63. static void __stdargs fingerd(int s,void *unused, void *p)
  64. {
  65.     char user[80];
  66.     FILE *fp;
  67.     char *file,*cp;
  68.  
  69.     sockmode(s,SOCK_ASCII);
  70.     sockowner(s,Curproc);
  71.     log(s,"open Finger");
  72.     recvline(s,user,80);
  73.     rip(user);
  74.     
  75.     if (strlen(user) == 0) {
  76.         fp = dir(Fdir, 0);
  77.         if (fp == NULLFILE)
  78.             usprintf(s,"No finger information available\n");
  79.         else
  80.             usprintf(s,"Known users on this system:\n");
  81.     } else {
  82.         file = pathname(Fdir, user);
  83.         cp   = pathname(Fdir, "");
  84.  
  85.         /* Check for attempted security violation (e.g., somebody
  86.          * might be trying to finger "../ftpusers"!)
  87.          */
  88.          
  89.         if (strncmp(file, cp, strlen(cp)) != 0){
  90.             fp = NULLFILE;
  91.             usprintf(s, "Invalid user name %s\n", user);
  92.         } else if((fp = fopen(file, READ_TEXT)) == NULLFILE)
  93.             usprintf(s, "User %s not known\n", user);
  94.         free(cp);
  95.         free(file);
  96.     }
  97.     if (fp != NULLFILE) {
  98.         sendfile(fp, s, ASCII_TYPE, 0, 0);
  99.         fclose(fp);
  100.     }
  101.     if (strlen(user) == 0 && Listusers != NULL) {
  102.         (*Listusers)(s);
  103.     }
  104.     close_s(s);
  105.     log(s, "close Finger");
  106. }
  107.  
  108. int fin0(int argc, char *argv[], void *p)
  109. {
  110.     close_s(Sfinger);
  111.     Sfinger = -1;
  112.     return 0;
  113. }
  114.